package ssh

import (
	"fmt"
	"log"
	"quickK8s/config"
	"quickK8s/pkg/utils"
)

// Manager SSH 配置管理结构体
type Manager struct {
	cfg      *config.ClusterConfig
	executor utils.CommandExecutor
}

// NewManager 创建 SSH 配置管理器实例
func NewManager(cfg *config.ClusterConfig, executor utils.CommandExecutor) *Manager {
	return &Manager{
		cfg:      cfg,
		executor: executor,
	}
}

// SetupSSH 配置SSH免密登录
func (m *Manager) SetupSSH() {
	// 安装 sshpass
	if err := m.executor.RunCommand("dpkg", "-i", "./packages/sshpass*.deb"); err != nil {
		// 如果安装失败，尝试修复依赖
		_ = m.executor.RunCommand("apt-get", "-f", "install", "-y")
		if err := m.executor.RunCommand("dpkg", "-i", "./packages/sshpass*.deb"); err != nil {
			log.Fatalf("安装 sshpass 失败: %v", err)
		}
	}

	// 检查是否已存在 SSH 密钥
	if err := m.executor.RunCommand("test", "-f", "/root/.ssh/id_rsa"); err != nil {
		// 不存在则生成新的 SSH 密钥对
		if err := m.executor.RunCommand("ssh-keygen", "-t", "rsa", "-N", "", "-f", "/root/.ssh/id_rsa", "-q"); err != nil {
			log.Fatalf("生成 SSH 密钥失败: %v", err)
		}
	}

	// 确保 .ssh 目录权限正确
	_ = m.executor.RunCommand("chmod", "700", "/root/.ssh")
	_ = m.executor.RunCommand("chmod", "600", "/root/.ssh/id_rsa")

	// 合并所有节点
	allNodes := append(m.cfg.Cluster.Masters, m.cfg.Cluster.Nodes...)

	// 配置各节点的 SSH
	for _, node := range allNodes {
		// 如果未配置，则复制公钥
		if err := m.executor.RunCommand("sshpass", "-p", m.cfg.Cluster.Password,
			"ssh-copy-id", "-o", "StrictHostKeyChecking=no",
			fmt.Sprintf("root@%s", node)); err != nil {
			log.Printf("警告: 节点 %s 配置免密登录失败: %v", node, err)
			continue
		}

		// 验证配置
		if err := m.executor.RunCommand("ssh", "-o", "PasswordAuthentication=no",
			"-o", "StrictHostKeyChecking=no",
			fmt.Sprintf("root@%s", node), "echo '免密登录测试成功'"); err != nil {
			log.Printf("警告: 节点 %s 免密登录验证失败: %v", node, err)
		} else {
			log.Printf("节点 %s 配置免密登录成功", node)
		}
	}

	log.Println("SSH 配置完成")
}
